package com.secxiot.provider.user.service;

import com.secxiot.common.entity.ResultVo;
import com.secxiot.provider.system.dto.AppSchedulDto;
import com.secxiot.provider.system.entity.AppPunchCard;
import com.secxiot.provider.system.entity.AppSchedulRecord;
import com.secxiot.provider.system.vo.AppPunchCardVo;
import com.secxiot.provider.system.vo.AppSchedulRecordVo;
import com.secxiot.provider.system.vo.AppSchedulVo;
import com.secxiot.provider.task.vo.TaskStatusVo;
import com.secxiot.provider.user.dto.BindDto;
import com.secxiot.provider.user.entity.UserAccount;
import com.secxiot.provider.user.entity.UserDo;
import com.secxiot.provider.user.vo.*;

import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;

public interface UserService {

    /**
     * 保存用户的有效数据
     *
     * @param userDo 用户信息数据
     * @return 新增数据数量
     */
    Integer save(UserDo userDo);

    /**
     * 用户注册
     *
     * @param userDo 用户注册提交信息
     * @return 新增用户数量
     */
    Integer registry(UserDo userDo);

    /**
     * 更新用户的有效信息
     *
     * @param userDo 用户信息
     * @return 更新成功数量
     */
    Integer update(UserDo userDo);

    /**
     * 根据用户手机号获取用户信息
     *
     * @param mobile     手机号码
     * @param clientType 手机号码
     * @return 用户信息
     */
    UserDo getByPhone(String mobile, String clientType);

    /**
     * 根据微信openId获取用户信息
     *
     * @param wxOpenid 微信openId
     * @return 用户信息
     */
    UserDo getByWxOpenid(String wxOpenid);

    /**
     * 根据id获取用户信息
     *
     * @param id 用户id
     * @return 用户信息
     */
    UserDo getById(Long id);

    List<UserDo> selectUserAll(Map<String, Object> map);

    /**
     * 扫码绑定关系
     *
     * @param bindDto 扫码对象
     * @return 数量
     */
    Integer bindUserRel(BindDto bindDto);

    /**
     * 用户获取可用的用户列表
     *
     * @param userId   用户id
     * @param userType 用户类型，0000100001	患者
     * @param deptId   部门id，不传则不进行部门筛选，返回所有符合条件的用户列表
     * @return 可用的用户列表
     */
    List<UserSimpleVo> getUserSimpleList(Long userId, List<String> userType, Long deptId, Integer directFlag, String taskType);

    /**
     * 添加紧急联系人
     *
     * @param userId   用户id
     * @param relation 关系
     * @param name     姓名
     * @param mobile   手机号
     * @return 是否成功
     */
    UserEmergencyContactVo addContact(Long userId, String relation, String name, String mobile);

    /**
     * 获取部门患者列表
     *
     * @param deptId
     * @return
     */
    List<PatientVo> listUserParent(Long deptId);

    /**
     * 获取SOS接收者
     *
     * @param hospitalId 医院id
     * @param deptId     部门id
     * @param taskType   任务类型
     * @return 接收者列表
     */
    List<UserSimpleVo> listHospitalSOSDoctor(Long hospitalId, Long deptId, String taskType);

    /**
     * 获取紧急联系人
     *
     * @param userId 用户id
     * @return
     */
    UserEmergencyContactVo getContact(Long userId);

    /**
     * 用户注册 -- 药品追踪记录小程序
     *
     * @param userDo 用户注册提交信息
     * @return 用户信息
     */
    Integer narcoticRegistry(UserDo userDo);

    /**
     * 用户注册 -- SOS小程序
     *
     * @param userDo 用户注册提交信息
     * @return 用户信息
     */
    Integer sosRegistry(UserDo userDo);

    /**
     * 添加考勤记录
     *
     * @param punchCard 打卡对象
     * @return
     */
    Integer addPunchCard(AppPunchCard punchCard);

    /**
     * 获取考勤记录列表(30天内)
     *
     * @param userId     用户ID
     * @param hospitalId 医院ID
     * @param dateTime   考勤时间
     * @return
     */
    List<AppPunchCardVo> getPunchCardList(Long userId, Long hospitalId, Date dateTime);

    /**
     * 获取打卡记录
     *
     * @param userId     用户ID
     * @param hospitalId 医院ID
     * @param punchType  打卡类型
     * @param punchTime  打卡时间
     * @return
     */
    AppPunchCardVo getPunchCard(Long userId, Long hospitalId, String punchType, Date punchTime);

    /**
     * 添加排班
     *
     * @param appSchedulDto 排班对象
     * @return
     */
    Integer addAppSchedul(AppSchedulDto appSchedulDto) throws ParseException;

    /**
     * 添加排班记录
     *
     * @param appSchedulRecord 排班记录
     * @return
     */
    Integer addAppSchedulRecord(AppSchedulRecord appSchedulRecord);

    /**
     * 获取排班记录
     *
     * @param userId     用户ID
     * @param hospitalId 医院ID
     * @return
     */
    List<AppSchedulVo> getAppSchedulList(Long userId, Long hospitalId);

    /**
     * 获取排班记录
     *
     * @param userId     用户ID
     * @param hospitalId 医院ID
     * @param schedulId  排班ID
     * @return
     */
    List<AppSchedulRecordVo> getAppSchedulRecordList(Long userId, Long hospitalId, Long schedulId);

    /**
     * 获取微信对象
     *
     * @param appId 微信AppID
     * @return
     */
    WxAppVo getWxApp(String appId);

    /**
     * 获取任务接收者当前任务
     *
     * @param receiverId 接收人用户ID
     * @return
     */
    List<TaskStatusVo> getTaskByReceiverId(Long receiverId);

    /**
     * 获取分享用户列表
     *
     * @param userId 用户ID
     * @return
     */
    List<UserVo> getPromoteUserList(Long userId, Long pageNo, Long pageSize);

    /**
     * 绑定分享码
     *
     * @param userId      用户ID
     * @param promoteCode 邀请码
     * @return
     */
    Integer bingPromoteCode(Long userId, String promoteCode);

    /**
     * 绑定用户提现账号
     *
     * @param userId     用户ID
     * @param type       账户类型
     * @param payAccount 账号
     * @return
     */
    Integer bingUserAccount(Long userId, Integer type, String payAccount);

    /**
     * 编辑用户提现账号
     *
     * @param userId     用户ID
     * @param type       账户类型
     * @param payAccount 账号
     * @return
     */
    Integer editUserAccount(Long userId, Integer type, String payAccount);

    UserAccount getUserAccount(Long userId);

    /**
     * 删除文件
     *
     * @return
     */
    void deleteLogFile(String date);
}
